<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 封装栈结构

    // 几个关键方法
    // push 添加
    // pop 删除
    // peek 返回栈顶
    // isEmpty 是否为空
    // clear 清空
    // size 查看有几个元素  


    class Stack {
      #items = [] // #配置上私有属性 避免被污染

      // 所有的方法加上return 是因为想看返回值
      // 调试方法 在控制台输入
      // stack.push(2)
      // stack.size()
      // stack.pop()
      // 调用方法 便可以调试

      pop () {
        return this.#items.pop()
      }
      push (data) {
        return this.#items.push(data)
      }
      peek () {
        // return this.#items[this.#items.length - 1] // 麻烦
        return this.#items.at(-1)  // -1取最后一个值  -2取倒数第二个
      }
      isEmpty () {
        return this.#items.length === 0
      }
      size () {
        return this.#items.length
      }
      clear () {
        this.#items = []
      }
      toString () {
        return this.#items.join('') // 可选择用什么来拼接 
      }
    }
    // let stack = new Stack()


    // 栈结构的应用
    // 封装十进制转二进制的方法
    function convert (decNumber) {
      // 先实例化类
      let remStack = new Stack()
      let number = decNumber
      let string = ""
      while (number > 0) {
        // 把余数添加到数组
        remStack.push(number % 2)
        number = Math.floor(number / 2)
      }
      while (!(remStack.isEmpty())) {
        string += remStack.pop()
      }
      return string
    }
    console.log(convert(50));


    // 可配置的 进制转换
    function newConvert (decNumber ,base ) {
      // 先实例化类
      let remStack = new Stack()
      let number = decNumber
      let string = ""
      let baseString = "0123456789ABCDEF"
      while (number > 0) {
        // 把余数添加到数组
        remStack.push(number % base)
        number = Math.floor(number / base)
      }
      while (!(remStack.isEmpty())) {
        string += baseString[remStack.pop()] 
      }
      return string
    }
    console.log(newConvert(500,16));

  </script>
</body>

</html>